package xyz.zhno.template.common.core.util;

import cn.hutool.core.bean.BeanUtil;

/**
 * Bean工具类
 * @author zh_o
 */
public class BeanUtils {

    /**
     * 复制Bean属性
     * @param sourceBean 原Bean实例
     * @param targetBean 目标Bean类型
     * @return 目标Bean的实例
     */
    public static <T> T copyProperties(Object sourceBean, Class<T> targetBean) {
        return BeanUtil.copyProperties(sourceBean, targetBean);
    }

    /**
     * 复制Bean属性
     * @param sourceBean 原Bean实例
     * @param targetBean 目标Bean类型
     * @param ignoreProperties 不需要复制的属性
     * @return 目标Bean的实例
     */
    public static <T> T copyProperties(Object sourceBean, Class<T> targetBean, String ... ignoreProperties) {
        return BeanUtil.copyProperties(sourceBean, targetBean, ignoreProperties);
    }

    /**
     * Bean实例属性复制
     * @param sourceBean 原Bean实例
     * @param targetBean 目标Bean实例
     */
    public static void copyProperties(Object sourceBean, Object targetBean) {
        BeanUtil.copyProperties(sourceBean, targetBean);
    }

    /**
     * Bean实例属性复制
     * @param sourceBean 原Bean实例
     * @param targetBean 目标Bean实例
     * @param ignoreProperties 不需要复制的属性
     */
    public static void copyProperties(Object sourceBean, Object targetBean, String ... ignoreProperties) {
        BeanUtil.copyProperties(sourceBean, targetBean, ignoreProperties);
    }

    /**
     * Bean实例属性复制，忽略属性大小写
     * @param sourceBean 原Bean实例
     * @param targetBean 目标Bean实例
     */
    public static void copyPropertiesIgnoreCase(Object sourceBean, Object targetBean) {
        BeanUtil.copyProperties(sourceBean, targetBean, true);
    }

    /**
     * 判断Bean是否为空对象，本身为null或所有属性都为null
     * @param obj 需要判断的对象
     * @param ignoreFiledNames 需要忽略字段
     */
    public static boolean isEmpty(Object obj, String ... ignoreFiledNames) {
        return BeanUtil.isEmpty(obj, ignoreFiledNames);
    }

    /**
     * 判断Bean是否不为空对象，本身为null或所有属性都为null
     * @param obj 需要判断的对象
     * @param ignoreFiledNames 需要忽略字段
     */
    public static boolean isNotEmpty(Object obj, String ... ignoreFiledNames) {
        return !isEmpty(obj, ignoreFiledNames);
    }

}
